Skip to content

Prevent duplicate Quick Edit save requests - #12869

Open
ArkaPrabhaChowdhury wants to merge 3 commits into
WordPress:trunkfrom
ArkaPrabhaChowdhury:trac-25696-inline-edit-lock
Open

Prevent duplicate Quick Edit save requests#12869
ArkaPrabhaChowdhury wants to merge 3 commits into
WordPress:trunkfrom
ArkaPrabhaChowdhury:trac-25696-inline-edit-lock

Conversation

@ArkaPrabhaChowdhury

@ArkaPrabhaChowdhury ArkaPrabhaChowdhury commented Aug 6, 2026

Copy link
Copy Markdown

Fixes #25696

What changed

  • Ignore repeated post and taxonomy Quick Edit saves while the current AJAX request is active.
  • Clear the guard when the request completes, including failed requests.
  • Add QUnit coverage for both editors.

Why

Double-clicking Quick Edit can submit duplicate requests. The first response removes the inline-edit row, while the second response then operates on missing markup.

Validation

  • QUnit tests pass.
  • JavaScript coding standards pass.
  • JavaScript type checking passes.
  • Built-files check passes.
  • PHP coding standards checks pass in CI.

Trac: https://core.trac.wordpress.org/ticket/25696

@ArkaPrabhaChowdhury
ArkaPrabhaChowdhury force-pushed the trac-25696-inline-edit-lock branch from 3d54122 to 93ec099 Compare August 6, 2026 07:57
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

Test using WordPress Playground

The changes in this pull request can previewed and tested using a WordPress Playground instance.

WordPress Playground is an experimental project that creates a full WordPress instance entirely within the browser.

Some things to be aware of

  • All changes will be lost when closing a tab with a Playground instance.
  • All changes will be lost when refreshing the page.
  • A fresh instance is created each time the link below is clicked.
  • Every time this pull request is updated, a new ZIP file containing all changes is created. If changes are not reflected in the Playground instance,
    it's possible that the most recent build failed, or has not completed. Check the list of workflow runs to be sure.

For more details about these limitations and more, check out the Limitations page in the WordPress Playground documentation.

Test this pull request with WordPress Playground.

@ArkaPrabhaChowdhury
ArkaPrabhaChowdhury force-pushed the trac-25696-inline-edit-lock branch from 93ec099 to b8a0463 Compare August 6, 2026 08:00
@ArkaPrabhaChowdhury
ArkaPrabhaChowdhury force-pushed the trac-25696-inline-edit-lock branch from b8a0463 to 09bbfae Compare August 6, 2026 08:03
@ArkaPrabhaChowdhury
ArkaPrabhaChowdhury marked this pull request as ready for review August 6, 2026 14:03
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

Core Committers: Use this line as a base for the props when committing in SVN:

Props arkaprabhachowdhury, irozum.

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@irozum irozum left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a solid, minimal fix for the actual root cause of #25696: a shared saving guard set synchronously before the request is sent means a second click (or Enter keypress) while a save is in flight returns false immediately instead of firing a second request that can later operate on a row the first response already replaced/removed. It also matches the approach afercia proposed for this exact ticket over a decade ago ("when saving maybe it should just return false").

I checked out the branch, ran a full rebuild, and ran the QUnit suite plus typecheck:js — all pass, including the two new tests. CI's own Coding Standards/PHPUnit-equivalent checks are green too; the one red job (PHP 8.0 / MariaDB 12.1) is an unrelated infra failure (composer update couldn't reach packagist.org), not something this diff caused. .always() correctly clears the flag on both success and error/network-failure paths, so there's no way to get the button stuck.

One thing worth a mention on the ticket rather than blocking here: saving is shared per editor instance, not per-row, so opening Quick Edit on a different row while another row's save is still in flight will silently no-op that click with zero feedback until the first request resolves — same "should we show a busy cursor" concern azaozz raised in comment 16 back in 2015, still open. Given requests are typically sub-second this is low-impact, but it's the kind of thing that's easy to miss testing manually since it only shows up under real latency.

Small nit: the file's top-level namespace docblock documents @property {string} type / @property {string} what for inlineEditPost — worth adding @property {boolean} saving there too for consistency, alongside the inline comment on the property itself.

@ArkaPrabhaChowdhury

Copy link
Copy Markdown
Author

@irozum Thanks for the review. I added the requested @property {boolean} saving entry to the top-level inlineEditPost namespace docblock and pushed it in commit 3e3dcd3e73.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants